const { Client } = require('pg');
const fs = require('fs').promises;
const path = require('path');

const client = new Client({
  host: "127.0.0.1",
  user: "postgres",
  password: "whuyiyulu666666",
  database: "animalsmigration",
  port: 5432,
});

client.connect() // 建立连接
  .catch(err => {
    console.error('连接数据库失败:', err.stack);
    process.exit(1);
  });

// 检查文件是否已存在的函数
async function checkFileExists(fileName) {
    try {
        const result = await client.query(
            'SELECT COUNT(*) FROM knowledge_files WHERE file_name = $1',
            [fileName]
        );
        return result.rows[0].count > 0;
    } catch (err) {
        console.error('检查文件是否存在时出错:', err.stack);
        return false;
    }
}

async function insertFile(fileName, filePath, fileType, mimeType) {
    try {
        // 检查文件是否已存在
        const fileExists = await checkFileExists(fileName);
        if (fileExists) {
            console.log(`文件 ${fileName} 已存在，跳过插入。`);
            return;
        }

        // 读取文件为 Buffer
        const fileBuffer = await fs.readFile(filePath);

        // 定义 animals_pair（这里直接硬编码，实际应用中可以根据文件名或其他逻辑动态生成）
        const animals_pair = '{"animal1":"monkey", "animal2":"rabbit"}';

        // 执行 SQL 插入
        const res = await client.query(
            `INSERT INTO knowledge_files 
            (file_name, file_type, mime_type, animal_species_pair, file_data)
            VALUES ($1, $2, $3, $4, $5)
            RETURNING file_id`,  // 返回插入的 ID
            [fileName, fileType, mimeType, animals_pair, fileBuffer]
        );
        
        console.log(`文件插入成功，ID: ${res.rows[0].file_id}`);
    } catch (err) {
        console.error('插入失败:', err.stack);
    }
}

async function insertAllPDFsFromDir(dirPath) {
    try {
        // 读取目录下所有文件
        const files = await fs.readdir(dirPath);
        console.log('目录中的文件:', files);

        for (const file of files) {
            const filePath = path.join(dirPath, file);
            console.log('处理文件路径:', filePath);

            // 判断是否为 PDF 文件
            if (file.endsWith('.pdf')) {
                await insertFile(file, filePath, 'pdf', 'application/pdf');
            }
        }

        // 所有文件处理完成后关闭数据库连接
        await client.end();
        console.log('数据库连接已关闭。');
    } catch (err) {
        console.error('批量插入文件时出错:', err.stack);
        await client.end(); // 确保在出错时也关闭连接
    }
}

// 调用示例（路径请改成你自己的绝对或相对路径）
insertAllPDFsFromDir('./insert_data/data_tobe_inserted');